####################################################
# Python数据可视化——使用Matplotlib创建散点图

# NumPy是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
# Matplotlib 是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互环境生成出版质量级别的图形
####################################################

# datingTestSet2.txt文件中的数据类型: 每年获得的飞行里程数,游戏耗时百分比,每周消费的冰淇淋公升数,分类结果(1,2,3三种分类结果)

from numpy import *
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties


# 解析文件, 可输出矩阵和类标签向量;  将文本记录转换为Numpy的解析程序
def file2matrix(filename):
    # 打开文件
    fr = open(filename)
    # 获取文件的行数
    numberOfLines = len(fr.readlines())
    # 初始化二维数组
    returnMat = zeros((numberOfLines, 3))
    # 初始化类标签向量
    classLabelVector = []
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        # 去除每行的前后空格
        line = line.strip()
        # 获取某行并切割成数组
        listFromLine = line.split('\t')
        # 将行数组赋值给二维矩阵
        returnMat[index, :] = listFromLine[0:3]
        # 一个数组a=[0,1,2,3,4]，a[-1]表示数组中最后一位，a[:-1]表示从第0位开始直到最后一位，a[::-1]表示倒序，从最后一位到第0位。
        classLabelVector.append(int(listFromLine[-1]))
        index += 1
    return returnMat, classLabelVector


# 读取字体库
zhfont = FontProperties(fname='C:/Windows/Fonts/simsun.ttc', size=12)
datingDataMat, datingLabels = file2matrix('../datingTestSet2.txt')

# 创建图标
fig = plt.figure()
plt.figure(figsize=(8, 5), dpi=80)
ax = plt.subplot(111)
# 将类标签向量
datingLabels = np.array(datingLabels)
idx_1 = np.where(datingLabels == 1)
p1 = ax.scatter(datingDataMat[idx_1, 0], datingDataMat[idx_1, 1], marker='*', color='r', label='1', s=10)
idx_2 = np.where(datingLabels == 2)
p2 = ax.scatter(datingDataMat[idx_2, 0], datingDataMat[idx_2, 1], marker='o', color='g', label='2', s=20)
idx_3 = np.where(datingLabels == 3)
p3 = ax.scatter(datingDataMat[idx_3, 0], datingDataMat[idx_3, 1], marker='+', color='b', label='3', s=30)

plt.xlabel(u'每年获取的飞行里程数', fontproperties=zhfont)
plt.ylabel(u'玩视频游戏所消耗的事件百分比', fontproperties=zhfont)
ax.legend((p1, p2, p3), (u'不喜欢', u'魅力一般', u'极具魅力'), loc=2, prop=zhfont)
plt.show()
